/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOArticulo;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.entidad.Articulo;

/**
 *
 * @author DESARROLLO01
 */
@SuppressWarnings("unchecked")
@Repository("daoArticulos")
public class DAOArticuloImpl extends DaoImpl<Articulo, Integer> implements IDAOArticulo, Serializable {

    private static Logger logger = Logger.getLogger(DAOCategoriaArticuloImpl.class);
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public Collection<Articulo> obtenerArticuloBusqueda(Articulo articulo) throws DAOException {
        List<Articulo> listaArticulos = new ArrayList<Articulo>();
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(Articulo.class)
                    .createAlias("idCategoriaArticulo", "ca")
                    .addOrder(Order.desc("id"))
                    .add(Restrictions.like("nombreComercial", "%" + articulo.getNombreComercial() + "%"))
                    .add(Restrictions.like("detalle", "%" + articulo.getDetalle() + "%"))
                    .add(Restrictions.like("modelo", "%" + articulo.getModelo() + "%"))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()));
            if (articulo.getIdCategoriaArticulo() != null) {
                listaArticulos = query.add(Restrictions.disjunction()
                        .add(Restrictions.eq("idCategoriaArticulo", articulo.getIdCategoriaArticulo()))
                        .add(Restrictions.eq("ca.idCategoriaArticulo", articulo.getIdCategoriaArticulo()))).list();
            } else {
                listaArticulos = query.list();
            }

        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }

        return listaArticulos;
    }

    @Override
    public Articulo obtenerArticuloPorNombreComercial(String nombreComercial) throws DAOException {
        Articulo articulo = new Articulo();
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(Articulo.class)
                    .add(Restrictions.eq("nombreComercial", nombreComercial))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()));

            articulo = (Articulo) query.uniqueResult();

        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }

        return articulo;
    }

    @Override
    public Collection<Articulo> obtenerArticulosPorCategoria(Articulo articulo) throws DAOException {
        List<Articulo> listaArticulos = new ArrayList<Articulo>();
        try {
            sessionFactory.getCurrentSession().flush();
            listaArticulos = sessionFactory.getCurrentSession().createCriteria(Articulo.class)
                    .createAlias("idCategoriaArticulo", "ca")
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.disjunction()
                    .add(Restrictions.eq("idCategoriaArticulo", articulo.getIdCategoriaArticulo()))
                    .add(Restrictions.eq("ca.idCategoriaArticulo", articulo.getIdCategoriaArticulo()))).list();
        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }

        return listaArticulos;
    }

    @Override
    public Collection<Articulo> buscarArticulosPorModelo(Articulo articulo) throws DAOException {
        List<Articulo> listaArticulos = new ArrayList<Articulo>();
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(Articulo.class)
                    .add(Restrictions.eq("modelo", articulo.getModelo()))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()));
            if(articulo.getIdCategoriaArticulo() != null){
                query = query.add(Restrictions.eq("idCategoriaArticulo", articulo.getIdCategoriaArticulo()));
            }
            query.addOrder(Order.asc("nombreComercial"));
            listaArticulos = query.list();
        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }

        return listaArticulos;
    }

    @Override
    public Collection<Articulo> obtenerReportePorModelo(Articulo articulo) throws DAOException {
        List<Articulo> listaArticulos = new ArrayList<Articulo>();
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(Articulo.class)
                    .createAlias("idCategoriaArticulo", "ca")
                    .addOrder(Order.desc("nombreComercial"))
                    .addOrder(Order.desc("detalle"))
                    .add(Restrictions.eq("modelo", articulo.getModelo()))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("idCategoriaArticulo", articulo.getIdCategoriaArticulo()));

            listaArticulos = query.list();

        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }

        return listaArticulos;
    }

    @Override
    public Collection<String> listarModelosDistintos(Articulo articulo) throws DAOException {
        Collection<String> lista = null;
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(Articulo.class)
                    .addOrder(Order.asc("modelo"))
                    .add(Restrictions.like("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .setProjection(Projections.distinct(Projections.property("modelo")));

            if (articulo.getIdCategoriaArticulo() != null) {
                lista = query.add(Restrictions.eq("idCategoriaArticulo", articulo.getIdCategoriaArticulo())).list();
            } else {
                lista = query.list();
            }
            return lista;

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

    }
}
